#include "node.h"
#include <stdlib.h>
#include <iostream>
#include <math.h>
#include <vector>
using namespace std;

#ifndef FIB_HEAP_H
#define FIB_HEAP_H
#define INF 0xFFFFFFFF

class fib_heap
{
private:

    Node *min; //Este es el H.min del heap, es decir el nodo con la clave minima
    int nodes;

public:

    vector <Node*> NodeArray;

    fib_heap();

    int minimo();

    void Insert(int key); //funcion para insertar un nodo

    void Impr(Node *&actual); //funcion para mostrar el heap completo

    Node *& Get_Min(); // funcion que retorna el H.min del heap

    void Reset(Node *&actual);

    void Union(Node *&heap_min, int heap_nodes); //Funcion para unir dos heaps de fibonacci

    void Decrease_Key(Node *&actual, int new_key);

    int Get_Nodes();

    void Cut(Node *&actual, int new_key);

    void Cut_Cascade(Node *&actual);

    void Extract_Min();

    void Clear(Node *&actual);

    void Consolidate(Node *&actual);

    void Reset_Level(Node *&actual);

    void Insert_Node(Node *&actual);

    void Heap_Link(Node *&actual, Node *&down);

    void Delete(Node *&actual);

    void Is_Heap(Node *&actual, bool &is);

};

#endif // FIB_HEAP_H
